#include "bsp_74hc165.h"
/*************************************************************
函数名称：bsp_74hc165_init
函数参数：无
函数返回：无
函数功能：初始化75HC165的相关IO口
其他解释：无
**************************************************************/
void bsp_74hc165_init(void)
{
	//PL	普通IO		输出	P0.0	高有效		低载入
	//CLK	普通IO		输出	P1.29	上升沿移数据
	//DATA	普通IO		输入	P0.25	
	//分配引脚功能 普通IO
	LPC_PINCON->PINSEL0 &= ~(03ul << 0);	//PL  	P0.0
	LPC_PINCON->PINSEL3 &= ~(03ul << 26);	//SCK 	P1.29
	LPC_PINCON->PINSEL1 &= ~(03ul << 18);	//DATA 	P0.25
	//初始化IO口状态
	LPC_GPIO0->FIODIR |= (1 << 0);			//输出  PL
	LPC_GPIO1->FIODIR |= (1 << 29);			//输出  CLK
	LPC_GPIO0->FIODIR &= ~(1<< 25);			//输入	DATA
}

/*************************************************************
函数名称：read_74hc165
函数参数：	dat读取的数据，指针形式，防止读取的数量过多
			read_num读取的次数，即多少片165级联
函数返回：无
函数功能：读取串行输入的数据
其他解释：读取到的数据
**************************************************************/
void read_74hc165(uint8_t *dat,char read_num)
{
	uint8_t value =0 ;
	uint16_t i=0;
	LPC_GPIO0->FIOCLR |= (1<<0);					//拉低锁存数据
	for(i=0;i<1000;i++);
	LPC_GPIO0->FIOSET |= (1<<0);		
	for(i=0;i<8*read_num;i++)	
	{
		LPC_GPIO1->FIOCLR |= (1<<29);				//拉低时钟引脚
		if((LPC_GPIO0->FIOPIN & (1<<25)) ? 1 : 0)	//读数据
		{
			value |= 0x01;
		}
		value = value<<1;							//数据向左移位
		LPC_GPIO1->FIOSET |= (1<<29);
		if((i+1)%8 == 0)							//读取八次进行把数据保存，防止丢失之前的读取的，因为value是uint8_t类型
		{
			*dat++ = value; 						//这里一定是要把value的值传过来，不能传递地址
		}
	}
}
